package com.cicoding.config;

import com.rscja.deviceapi.RFIDWithUHFNetworkUR4;
import com.rscja.deviceapi.entity.AntennaNameEnum;
import com.rscja.deviceapi.entity.AntennaPowerEntity;
import com.rscja.deviceapi.entity.AntennaState;
import com.rscja.deviceapi.interfaces.ConnectionStateCallback;
import com.rscja.deviceapi.interfaces.IUHF;
import com.rscja.deviceapi.interfaces.IUHFInventoryCallback;
import lombok.Data;

import javax.swing.*;
import java.nio.charset.StandardCharsets;
import java.util.List;

@Data
public class UhfDevice {
    private RFIDWithUHFNetworkUR4 uhf = new RFIDWithUHFNetworkUR4();
    private String ip = null;
    private int port = 0;
    private String antArray = null;

    public UhfDevice(String ip, int port) {
        this.ip = ip;
        this.port = port;
    }

    public UhfDevice(String ip, int port, String antArray) {
        this.ip = ip;
        this.port = port;
        this.antArray = antArray;
    }

    public UhfDevice() {
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    /**
     * 配置天线功率
     *
     * @param ant   天线号
     * @param power 功率
     * @return
     */
    public boolean setPower(AntennaNameEnum ant, int power) {
        return uhf.setPower(ant, power);
    }

    /**
     * 设置标签监听
     */
    public void setUhfRl(IUHFInventoryCallback iuhfInventoryCallback) {
        //监听标签数据
        uhf.setInventoryCallback(iuhfInventoryCallback);
    }

    /**
     * 设置断开监听
     *
     * @param connectionStateCallback 监听方法类
     */
    public void setUhfRel(ConnectionStateCallback connectionStateCallback) {
        //设置断开监听
       // uhf.setEPCMode();
        uhf.setConnectionStateCallback(connectionStateCallback);
    }

    public void setEPCMode() {
        //设置断开监听
        boolean result1 = uhf.setEPCMode();
        if(!result1){
            System.out.println("设置失败");
        }else{
            System.out.println("设置成功");
        }
    }

    public void setEPCAndTIDMode() {
        //设置断开监听
        boolean result1 = uhf.setEPCAndTIDMode();
        if(!result1){
            System.out.println("设置失败");
        }else{
            System.out.println("设置成功");
        }
    }

    /**
     * 获取功率
     *
     * @return
     */
    public List<AntennaPowerEntity> getPowerAll() {
        return uhf.getPowerAll();
    }

    /**
     * 设置天线
     *
     * @param antennaStateList
     * @return
     */
    public boolean setAntenna(List<AntennaState> antennaStateList) {
        return uhf.setAntenna(antennaStateList);
    }

    /**
     * 获取天线
     *
     * @return
     */
    public List<AntennaState> getAntenna() {
        return uhf.getAntenna();
    }


    /**
     * 开始盘点
     *
     * @return
     */
    public boolean startInventoryTag() {
        return uhf.startInventoryTag();
    }

    /**
     * 停止盘点
     *
     * @return
     */
    public boolean stopInventory() {
        return uhf.stopInventory();
    }

    /**
     * 连接设备，此函数会阻塞
     *
     * @return
     */
    public boolean connect() {
        boolean result = uhf.init(ip, port);
        if (result) {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 断开连接
     *
     * @return
     */
    public boolean disConnect() {
        return uhf.free();
    }

    /**
     * 读数据
     *
     * @param accessPwd 访问密码
     * @param bank      数据区  （ IUHF.Bank_RESERVED、   IUHF.Bank_EPC、   IUHF.Bank_TID、   IUHF.Bank_USER ）
     * @param ptr       起始地址，单位字
     * @param cnt       长度，单位字
     * @return
     */
    public String readData(String accessPwd,
                           int bank,
                           int ptr,
                           int cnt) {

        return uhf.readData(accessPwd, bank, ptr, cnt);
    }

    /**
     * 读数据
     *
     * @param accessPwd  访问密码
     * @param filterBank 过滤的存储区(IUHF.Bank_EPC、  IUHF.Bank_TID、   IUHF.Bank_USER)
     * @param filterPtr  过滤的起始地址，单位bit
     * @param filterCnt  过滤的数据长度，单位bit
     * @param filterData 过滤的数据
     * @param bank       数据区  （ IUHF.Bank_RESERVED、   IUHF.Bank_EPC、   IUHF.Bank_TID、   IUHF.Bank_USER ）
     * @param ptr        起始地址 ，单位字
     * @param cnt        长度，单位字
     * @return
     */
    public String readData(String accessPwd,
                           int filterBank,
                           int filterPtr,
                           int filterCnt,
                           String filterData,
                           int bank,
                           int ptr,
                           int cnt) {
        return uhf.readData(accessPwd, filterBank, filterPtr, filterCnt, filterData, bank, ptr, cnt);
    }

    /**
     * 写数据区
     *
     * @param accessPwd 访问密码
     * @param bank      数据区  （ IUHF.Bank_RESERVED、   IUHF.Bank_EPC、   IUHF.Bank_TID、   IUHF.Bank_USER ）
     * @param ptr       起始地址，单位字
     * @param cnt       长度，单位字
     * @param data      要写入的数据
     * @return
     */
    public boolean writeData(String accessPwd,
                             int bank,
                             int ptr,
                             int cnt, String data) {

        return uhf.writeData(accessPwd, bank, ptr, cnt, data);
    }

    /**
     * 写数据区
     *
     * @param accessPwd  访问密码
     * @param filterBank 过滤的存储区(IUHF.Bank_EPC、  IUHF.Bank_TID、   IUHF.Bank_USER)
     * @param filterPtr  过滤的起始地址，单位bit
     * @param filterCnt  过滤的数据长度，单位bit
     * @param filterData 过滤的数据
     * @param bank       数据区  （ IUHF.Bank_RESERVED、   IUHF.Bank_EPC、   IUHF.Bank_TID、   IUHF.Bank_USER ）
     * @param ptr        起始地址，单位字
     * @param cnt        长度，单位字
     * @param data       要写入的数据
     * @return
     */
    public boolean writeData(String accessPwd,
                             int filterBank,
                             int filterPtr,
                             int filterCnt,
                             String filterData,
                             int bank,
                             int ptr,
                             int cnt, String data) {
        return uhf.writeData(accessPwd, filterBank, filterPtr, filterCnt, filterData, bank, ptr, cnt, data);
    }

    /**
     * 写rfid数据
     *
     * @param filterData
     * @param data
     * @return
     */
    public boolean writeData(String filterData, String data) {
        return uhf.writeData("00000000", IUHF.Bank_EPC, 32, (filterData.getBytes(StandardCharsets.UTF_8).length * 4), filterData, IUHF.Bank_EPC, 2, (data.getBytes(StandardCharsets.UTF_8).length / 4), data);
    }

    public String getAntArray() {
        return antArray;
    }

    public void setAntArray(String antArray) {
        this.antArray = antArray;
    }
}
